package 继承.再谈初始化;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-16
 * Time: 19:18
 */
//【继承关系上的执行顺序】
class Person1 {
    public String name;
    public int age;

    public Person1(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Person1：构造代码块执行");
    }

    {
        System.out.println("Person1：实例代码块执行");
    }

    static {
        System.out.println("Person1：静态代码块执行");
    }
}

class Student extends Person1 {
    public Student(String name, int age) {
        super(name, age);
        System.out.println("Student：构造代码块执行");
    }

    {
        System.out.println("Student：实例代码块执行");
    }

    static {
        System.out.println("Student：静态代码块执行");
    }
}
public class TestDemo1 {
    public static void main(String[] args) {
        Student student = new Student("zhangsan", 19);
        System.out.println("===========");
        Student student1 = new Student("lisi", 25);
    }
    public static void main1(String[] args) {
        Person1 person1 = new Person1("张三", 19);
        System.out.println("===========");
        Person1 person11 = new Person1("李四", 25);
    }
}

/*
执行结果：
Person1：静态代码块执行
Student：静态代码块执行
Person1：实例代码块执行
Person1：构造代码块执行
Student：实例代码块执行
Student：构造代码块执行
===========
Person1：实例代码块执行
Person1：构造代码块执行
Student：实例代码块执行
Student：构造代码块执行
 */

/*
通过分析结果，得出以下结论：
1. 父类静态代码块优先于子类静态代码块执行，且是最早执行的
2. 父类实例代码块和父类构造代码块紧接着执行
3. 子类的实例代码块和子类构造代码块紧接着再执行
4. 第二次实例化子类对象的时候，父类和子类的静态代码块都将不会再执行(无论实例化多少对象，静态代码块只会执行一次)
 */